<!DOCTYPE HTML>
<html lang="cn" class="sidebar-visible no-js light">
    <head>
        <!-- Book generated using mdBook -->
        <meta charset="UTF-8">
        <title>我的分享</title>
        <meta name="robots" content="noindex" />


        <!-- Custom HTML head -->
        
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
        <meta name="description" content="">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="theme-color" content="#ffffff" />

        <link rel="icon" href="favicon.svg">
        <link rel="shortcut icon" href="favicon.png">
        <link rel="stylesheet" href="css/variables.css">
        <link rel="stylesheet" href="css/general.css">
        <link rel="stylesheet" href="css/chrome.css">
        <link rel="stylesheet" href="css/print.css" media="print">

        <!-- Fonts -->
        <link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
        <link rel="stylesheet" href="fonts/fonts.css">

        <!-- Highlight.js Stylesheets -->
        <link rel="stylesheet" href="highlight.css">
        <link rel="stylesheet" href="tomorrow-night.css">
        <link rel="stylesheet" href="ayu-highlight.css">

        <!-- Custom theme stylesheets -->

    </head>
    <body>
        <!-- Provide site root to javascript -->
        <script type="text/javascript">
            var path_to_root = "";
            var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "navy" : "light";
        </script>

        <!-- Work around some values being stored in localStorage wrapped in quotes -->
        <script type="text/javascript">
            try {
                var theme = localStorage.getItem('mdbook-theme');
                var sidebar = localStorage.getItem('mdbook-sidebar');

                if (theme.startsWith('"') && theme.endsWith('"')) {
                    localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
                }

                if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
                    localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
                }
            } catch (e) { }
        </script>

        <!-- Set the theme before any content is loaded, prevents flash -->
        <script type="text/javascript">
            var theme;
            try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
            if (theme === null || theme === undefined) { theme = default_theme; }
            var html = document.querySelector('html');
            html.classList.remove('no-js')
            html.classList.remove('light')
            html.classList.add(theme);
            html.classList.add('js');
        </script>

        <!-- Hide / unhide sidebar before it is displayed -->
        <script type="text/javascript">
            var html = document.querySelector('html');
            var sidebar = 'hidden';
            if (document.body.clientWidth >= 1080) {
                try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
                sidebar = sidebar || 'visible';
            }
            html.classList.remove('sidebar-visible');
            html.classList.add("sidebar-" + sidebar);
        </script>

        <nav id="sidebar" class="sidebar" aria-label="Table of contents">
            <div class="sidebar-scrollbox">
                <ol class="chapter"><li class="chapter-item expanded "><a href="介绍.html"><strong aria-hidden="true">1.</strong> 介绍</a></li><li class="chapter-item expanded affix "><li class="part-title">其他</li><li class="chapter-item expanded "><a href="交付质量优化.html"><strong aria-hidden="true">2.</strong> 交付质量优化</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="需求管理优化.html"><strong aria-hidden="true">2.1.</strong> 需求管理优化</a></li><li class="chapter-item expanded "><a href="代码质量优化.html"><strong aria-hidden="true">2.2.</strong> 代码质量优化</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="单元测试工具JUnit5.html"><strong aria-hidden="true">2.2.1.</strong> 单元测试工具JUnit5</a></li><li class="chapter-item expanded "><a href="单元测试流程.html"><strong aria-hidden="true">2.2.2.</strong> 单元测试流程</a></li><li class="chapter-item expanded "><a href="JUnit使用注意事项.html"><strong aria-hidden="true">2.2.3.</strong> JUnit使用注意事项</a></li><li><ol class="section"><li class="chapter-item expanded "><a href="JUnit的编码规范.html"><strong aria-hidden="true">2.2.3.1.</strong> JUnit的编码规范</a></li><li class="chapter-item expanded "><a href="JUnit5常用断言.html"><strong aria-hidden="true">2.2.3.2.</strong> JUnit5常用断言</a></li><li class="chapter-item expanded "><a href="JUnit5常用注释.html"><strong aria-hidden="true">2.2.3.3.</strong> JUnit5常用注释</a></li></ol></li><li class="chapter-item expanded "><a href="单元测试报告.html"><strong aria-hidden="true">2.2.4.</strong> 单元测试报告</a></li></ol></li><li class="chapter-item expanded "><a href="测试质量优化.html"><strong aria-hidden="true">2.3.</strong> 测试质量优化</a></li><li class="chapter-item expanded "><a href="安全方面优化.html"><strong aria-hidden="true">2.4.</strong> 安全方面优化</a></li><li class="chapter-item expanded "><a href="持续跟踪优化.html"><strong aria-hidden="true">2.5.</strong> 持续跟踪优化</a></li><li class="chapter-item expanded "><a href="考核内容调整.html"><strong aria-hidden="true">2.6.</strong> 考核内容调整</a></li></ol></li></ol>
            </div>
            <div id="sidebar-resize-handle" class="sidebar-resize-handle"></div>
        </nav>

        <div id="page-wrapper" class="page-wrapper">

            <div class="page">
                                <div id="menu-bar-hover-placeholder"></div>
                <div id="menu-bar" class="menu-bar sticky bordered">
                    <div class="left-buttons">
                        <button id="sidebar-toggle" class="icon-button" type="button" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
                            <i class="fa fa-bars"></i>
                        </button>
                        <button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
                            <i class="fa fa-paint-brush"></i>
                        </button>
                        <ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
                            <li role="none"><button role="menuitem" class="theme" id="light">Light (default)</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
                            <li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
                        </ul>
                        <button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
                            <i class="fa fa-search"></i>
                        </button>
                    </div>

                    <h1 class="menu-title">我的分享</h1>

                    <div class="right-buttons">
                        <a href="print.html" title="Print this book" aria-label="Print this book">
                            <i id="print-button" class="fa fa-print"></i>
                        </a>

                    </div>
                </div>

                <div id="search-wrapper" class="hidden">
                    <form id="searchbar-outer" class="searchbar-outer">
                        <input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
                    </form>
                    <div id="searchresults-outer" class="searchresults-outer hidden">
                        <div id="searchresults-header" class="searchresults-header"></div>
                        <ul id="searchresults">
                        </ul>
                    </div>
                </div>

                <!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
                <script type="text/javascript">
                    document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
                    document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
                    Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
                        link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
                    });
                </script>

                <div id="content" class="content">
                    <main>
                        <h1 id="介绍"><a class="header" href="#介绍">介绍</a></h1>
<div style="break-before: page; page-break-before: always;"></div><ul>
<li>交付质量优化
<ul>
<li>需求管理优化</li>
<li>代码质量优化
<ul>
<li>代码管理规范</li>
<li>单元测试优化
<ul>
<li><a href="%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7JUnit5.html">单元测试工具JUnit5</a></li>
<li><a href="%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%B5%81%E7%A8%8B.html">单元测试流程</a></li>
<li><a href="JUnit%E4%BD%BF%E7%94%A8%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.html">JUnit使用注意事项</a></li>
<li><a href="%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A.html">单元测试报告</a></li>
</ul>
</li>
</ul>
</li>
<li>测试质量优化</li>
<li>安全方面优化</li>
<li>持续跟踪优化</li>
<li>考核内容调整（如有必要）</li>
</ul>
</li>
</ul>
<div style="break-before: page; page-break-before: always;"></div><h1 id="需求管理优化"><a class="header" href="#需求管理优化">需求管理优化</a></h1>
<div style="break-before: page; page-break-before: always;"></div><h1 id="代码质量优化"><a class="header" href="#代码质量优化">代码质量优化</a></h1>
<div style="break-before: page; page-break-before: always;"></div><ul>
<li>JUnit 介绍
<ul>
<li><a href="https://tonydeng.github.io/2017/10/09/junit-5-tutorial-introduction/">JUnit5教程-简介</a></li>
<li><a href="https://pdai.tech/md/develop/ut/dev-ut-x-junit5.html">单元测试 - Junit5 详解</a></li>
<li>官网：<a href="https://junit.org/junit5/docs/current/user-guide/#overview">JUnit 5 User Guide</a></li>
</ul>
</li>
</ul>
<div style="break-before: page; page-break-before: always;"></div><pre><code class="language-mermaid">flowchart TD
A[开始]--&gt;B[需求评审]
B--&gt;C[确认需要单元测试部分]
C--&gt;D[任务分配]
D--&gt;E[单元测试用例编写]
E--&gt;H[开发Leader抽查用例]
E--&gt;F[业务代码编写]
F--&gt;TEST[单体测试]
TEST--&gt;E
TEST--&gt;G[形成测试报告]
G--&gt;REPORTTOBA[功能提交BA同时提交报告]
REPORTTOBA--&gt;I[BA检查功能&amp;抽查测试报告]
</code></pre>
<div style="break-before: page; page-break-before: always;"></div><ul>
<li>JUnit 注意事项
<ul>
<li>先编写测试用例再写代码（如果条件不允许则另外讨论方案）</li>
<li>规范参考<a href="JUnit%E7%9A%84%E7%BC%96%E7%A0%81%E8%A7%84%E8%8C%83.html">JUnit的编码规范</a></li>
<li>充分理解和学会使用 <a href="JUnit5%E5%B8%B8%E7%94%A8%E6%96%AD%E8%A8%80.html">JUnit5常用断言</a></li>
<li>了解 <a href="JUnit5%E5%B8%B8%E7%94%A8%E6%B3%A8%E9%87%8A.html">JUnit5常用注释</a></li>
</ul>
</li>
</ul>
<div style="break-before: page; page-break-before: always;"></div><h3 id="类名-"><a class="header" href="#类名-">类名 ：</a></h3>
<p>定义测试类，类名是由被测试类名 Test 构成。例如：CalculatorTest</p>
<h3 id="包名"><a class="header" href="#包名">包名：</a></h3>
<p>定义的测试类需要放在 xxx.xxx.xxx.test 包中。例如：package com.mylifes1110.test;</p>
<h3 id="方法名"><a class="header" href="#方法名">方法名：</a></h3>
<p>测试方法的方法名有两种定义方式 test 测试方法和测试方法。例如：testAdd 和 add</p>
<h3 id="返回值"><a class="header" href="#返回值">返回值：</a></h3>
<p>因为我们的方法只是在类中测试，可以独立运行，所以不需要处理任何返回值，所以这里使用 void。例如：public void add();</p>
<h3 id="参数列表"><a class="header" href="#参数列表">参数列表：</a></h3>
<p>因为我们的方法是用来测试的，至于参数列表的传入是没有必要的。我们在测试的时候自行传入需要的参数测试即可。所以在此参数列表为空。例如：例如：public void add();</p>
<h3 id="test-注解"><a class="header" href="#test-注解">@Test 注解：</a></h3>
<p>测试是需要运行来完成的。如果我们只有一个 main 方法，显然在结构上还是需要我们去注释掉测试过的。解决此问题这里我们需要在测试方法上方加@Test 注解来完成测试，只要是加该注解的方法，可以单独运行此方法来完成测试。</p>
<h3 id="test-注解-jar-包-junit45"><a class="header" href="#test-注解-jar-包-junit45">@Test 注解 jar 包 Junit4、5：</a></h3>
<p>@Test 注解是需要我们导入 jar 包才能使用的。jar 包有两个分别是：junit-4.13-rc-2 和 hamcrest-core-1.3。这里我使用的是 Junit4，单元测试还有 Junit5，版本差异我没有做了解。主要是可以完成测试才是硬道理！</p>
<h3 id="idea-快捷导入-junit45"><a class="header" href="#idea-快捷导入-junit45">IDEA 快捷导入 Junit4、5：</a></h3>
<p>我们可以先创建测试类和方法，然后在测试方法上方加入@Test 注解，此时 IDEA 显示的@Test 注解是飘红的，这时候我们使用 Alt + Enter 组合键来打开导入 Junit 单元测试列表，然后再选择 Junit4 或者 Junit5 确定即可导入成功！这时候再查看注解就没有飘红了！</p>
<div style="break-before: page; page-break-before: always;"></div><h2 id="junit-5-常用断言"><a class="header" href="#junit-5-常用断言">JUnit 5 常用断言</a></h2>
<p>下表提供了一些常用的 JUnit 5 断言方法。</p>
<table id="yR1sf"><tbody><tr><td><p id="u98180bd6"><strong><span>断言</span></strong></p></td><td><p id="u4ca94c32"><strong><span>描述</span></strong></p></td></tr><tr><td><p id="u8f8d52b8"><span>assertAll</span></p></td><td><p id="u2366ccd5"><span>分组断言，执行其中包含的所有断言</span></p></td></tr><tr><td><p id="u317d2c9d"><span>assertEquals</span></p></td><td><p id="u771ddd8c"><span>判断断言预期值和实际值是否相等</span></p></td></tr><tr><td><p id="ub526c3c7"><span>assertNotEquals</span></p></td><td><p id="u060f8d1d"><span>判断断言预期值和实际值是否不相等</span></p></td></tr><tr><td><p id="u483c812a"><span>assertArrayEquals</span></p></td><td><p id="u422a1a2c"><span>判断断言预期数组和实际数组相等</span></p></td></tr><tr><td><p id="u32a3369b"><span>assertTrue</span></p></td><td><p id="u112df6f1"><span>判断断言条件是否为真</span></p></td></tr><tr><td><p id="u95391c18"><span>assertFalse</span></p></td><td><p id="ua7eaa6d8"><span>判断断言条件是否为假</span></p></td></tr><tr><td><p id="u7a8810af"><span>assertNull</span></p></td><td><p id="u8aa4baa8"><span>判断断言条件是否为空</span></p></td></tr><tr><td><p id="u98a679a7"><span>assertNotNull</span></p></td><td><p id="u92fcb9f2"><span>判断断言条件是否不为空</span></p></td></tr><tr><td><p id="u394f28b4"><span>assertSame</span></p></td><td><p id="u145050c2"><span>判断两个对象引用是否指向同一个对象</span></p></td></tr><tr><td><p id="u1c7992db"><span>assertTimeout</span></p></td><td><p id="uf7a9f67d"><span>断言超时</span></p></td></tr><tr><td><p id="ueccaf456"><span>fail</span></p></td><td><p id="u1cf879a1"><span>使单元测试失败</span></p></td></tr></tbody></table><div style="break-before: page; page-break-before: always;"></div><h2 id="junit-5-注解"><a class="header" href="#junit-5-注解">JUnit 5 注解</a></h2>
<table id="cqtlB"><tbody><tr><td><p id="u0c281092"><strong><span>注解</span></strong></p></td><td><p id="u5d999114"><strong><span>描述</span></strong></p></td></tr><tr><td><p id="u55057081"><span>@Test</span></p></td><td><p id="u4811e3f9"><span>表示方法是一种测试方法。与 JUnit 4 的@Test 注解不同，此注释不会声明任何属性</span></p></td></tr><tr><td><p id="u9554be3c"><span>@ParameterizedTest</span></p></td><td><p id="u5f67df3b"><span>表示方法是参数化测试</span></p></td></tr><tr><td><p id="ubbeb6a03"><span>@RepeatedTest</span></p></td><td><p id="u4bc190a0"><span>表示方法是重复测试模板</span></p></td></tr><tr><td><p id="u2db2677b"><span>@TestFactory</span></p></td><td><p id="ud0fde8a2"><span>表示方法是动态测试的测试工程</span></p></td></tr><tr><td><p id="u8cc3d081"><span>@TestInstance</span></p></td><td><p id="ucf212ea6"><span>用于配置测试实例生命周期</span></p></td></tr><tr><td><p id="u6bb3b722"><span>@TestTemplate</span></p></td><td><p id="u89f5b661"><span>表示方法是为多次调用的测试用例的模板</span></p></td></tr><tr><td><p id="uefaf26b0"><span>@DisplayName</span></p></td><td><p id="ua103a54e"><span>为测试类或者测试方法自定义一个名称</span></p></td></tr><tr><td><p id="u206b77a7"><span>@BeforeEach</span></p></td><td><p id="u5004e892"><span>表示方法在每个测试方法运行前都会运行</span></p></td></tr><tr><td><p id="u63e290fa"><span>@AfterEach</span></p></td><td><p id="u538dac3b"><span>表示方法在每个测试方法运行之后都会运行</span></p></td></tr><tr><td><p id="u1515be91"><span>@BeforeAll</span></p></td><td><p id="uf5e8f723"><span>表示方法在所有测试方法之前运行，注意使用该注解的方法</span><strong><span>必须返回 void</span></strong><span>、访问级别</span><strong><span>不允许为 private</span></strong><span>，且必须声明为</span><strong><span>静态 (static) 方法</span></strong></p></td></tr><tr><td><p id="u425d0de8"><span>@AfterAll</span></p></td><td><p id="ub4c366df"><span>表示方法在所有测试方法之后运行，而且该注解的使用限制与</span> <span>@BeforeAll</span> <span>一致</span></p></td></tr><tr><td><p id="u4e5238d3"><span>@Nested</span></p></td><td><p id="u192a88d5"><span>表示带注解的类是嵌套的非静态测试类，@BeforeAll 和 @AfterAll 方法不能直接在 @Nested 测试类中使用，除非修改测试实例生命周期</span></p></td></tr><tr><td><p id="ud02cd29d"><span>@Tag</span></p></td><td><p id="u24c80f12"><span>用于在类或方法级别声明用于过滤测试的标记</span></p></td></tr><tr><td><p id="ub11c55bb"><span>@Disabled</span></p></td><td><p id="u830bea66"><span>用于禁用测试类或测试方法</span></p></td></tr><tr><td><p id="u5e56bce6"><span>@ExtendWith</span></p></td><td><p id="ubcd9fe07"><span>用于注册自定义扩展，该注解可以继承</span></p></td></tr></tbody></table>
<div style="break-before: page; page-break-before: always;"></div><h2 id="单元测试报告分两部分"><a class="header" href="#单元测试报告分两部分">单元测试报告分两部分</a></h2>
<ol>
<li>概要测试报告</li>
<li>代码覆盖率报告</li>
</ol>
<p><em>前期可以先完成概要测试报告</em></p>
<h2 id="概要测试报告"><a class="header" href="#概要测试报告">概要测试报告</a></h2>
<ol>
<li>建议使用 Allure 形成可视化单元测试报告，参考 <a href="https://qualitysphere.gitee.io/ext/allure/#52-junit-5">Allure</a></li>
<li>测试报告同代码一起提交</li>
<li>BA抽查测试报告</li>
<li>甚至于可以考虑将测试报告作为考评内容之一</li>
</ol>
<p><em>参考样例：<a href="https://cloud.tencent.com/developer/article/1974146">JUnit 5 集成 Allure 测试报告</a></em></p>
<h2 id="代码覆盖率报告"><a class="header" href="#代码覆盖率报告">代码覆盖率报告</a></h2>
<ol>
<li>建议使用工具 jacoco 工具。可参考 <a href="https://howtodoinjava.com/junit5/jacoco-test-coverage/">JaCoCo Code Coverage with Maven</a></li>
<li>其他流程同概要测试报告</li>
</ol>
<div style="break-before: page; page-break-before: always;"></div><h1 id="测试质量优化"><a class="header" href="#测试质量优化">测试质量优化</a></h1>
<div style="break-before: page; page-break-before: always;"></div><h1 id="安全方面优化"><a class="header" href="#安全方面优化">安全方面优化</a></h1>
<div style="break-before: page; page-break-before: always;"></div><h1 id="持续跟踪优化"><a class="header" href="#持续跟踪优化">持续跟踪优化</a></h1>
<div style="break-before: page; page-break-before: always;"></div><h1 id="考核内容调整"><a class="header" href="#考核内容调整">考核内容调整</a></h1>

                    </main>

                    <nav class="nav-wrapper" aria-label="Page navigation">
                        <!-- Mobile navigation buttons -->


                        <div style="clear: both"></div>
                    </nav>
                </div>
            </div>

            <nav class="nav-wide-wrapper" aria-label="Page navigation">

            </nav>

        </div>




        <script type="text/javascript">
            window.playground_copyable = true;
        </script>


        <script src="elasticlunr.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="mark.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="searcher.js" type="text/javascript" charset="utf-8"></script>

        <script src="clipboard.min.js" type="text/javascript" charset="utf-8"></script>
        <script src="highlight.js" type="text/javascript" charset="utf-8"></script>
        <script src="book.js" type="text/javascript" charset="utf-8"></script>

        <!-- Custom JS scripts -->

        <script type="text/javascript">
        window.addEventListener('load', function() {
            window.setTimeout(window.print, 100);
        });
        </script>

    </body>
</html>
